﻿cmake_minimum_required(VERSION 3.0)

option(USE_HUNTER "Use hunter" OFF)

if (USE_HUNTER)
	include("cmake/HunterGate.cmake")
	HunterGate(
		URL "https://github.com/cpp-pm/hunter/archive/v0.23.253.tar.gz"
		SHA1 "88ea6d37c897a81a080eb9ae0f69d7807bbb3c73"
	)
endif()

project(socks_server)

include(CheckCXXCompilerFlag)

CHECK_CXX_COMPILER_FLAG(-std=c++17 LIBCXX_HAS_STDCXX17_FLAG)

if (NOT MSVC)
	if(NOT LIBCXX_HAS_STDCXX17_FLAG)
		message(FATAL_ERROR "need at least GCC 9 or clang 9")
	endif()

	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
else()
	set(CompilerFlags
			CMAKE_CXX_FLAGS_DEBUG
			CMAKE_CXX_FLAGS_RELEASE
			CMAKE_CXX_FLAGS_MINSIZEREL
			CMAKE_CXX_FLAGS_RELWITHDEBINFO
			CMAKE_C_FLAGS_DEBUG
			CMAKE_C_FLAGS_RELEASE
			CMAKE_C_FLAGS_MINSIZEREL
			CMAKE_C_FLAGS_RELWITHDEBINFO
		)

	#foreach(CompilerFlag ${CompilerFlags})
	#	string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
	#endforeach()

	add_definitions(-D_CRT_SECURE_NO_WARNINGS)
	add_definitions(-D_WIN32_WINNT=0x0501)

	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
endif()

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
#set(Boost_USE_STATIC_RUNTIME ON)

if (USE_HUNTER)
	hunter_add_package(Boost COMPONENTS thread system filesystem coroutine context program_options)
endif()

find_package(Boost CONFIG REQUIRED COMPONENTS thread system filesystem coroutine context program_options)

message(STATUS "Find boost version: ${Boost_VERSION}")

if (NOT Boost_VERSION VERSION_LESS 106700)
	message(STATUS "Use boost coroutines v2")
	add_definitions(-DBOOST_COROUTINES_V2)
endif()

if (USE_HUNTER AND MSVC)
	add_definitions(-DBOOST_ALL_NO_LIB)
endif()

link_libraries(${Boost_LIBRARIES})
include_directories(${Boost_INCLUDE_DIRS})


file(GLOB libsocks_SRCS
	libsocks/v7.c
	libsocks/v7.h

	libsocks/io.hpp
	libsocks/socks_server.hpp
	libsocks/async_connect.hpp

	libsocks/socks_client.hpp
)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libsocks)

add_executable(socks_server ${libsocks_SRCS}
  src/server.cpp
)

add_executable(socks_client ${libsocks_SRCS}
  src/client.cpp
)

if(UNIX)
	target_link_libraries(socks_server ${Boost_LIBRARIES} pthread)
	target_link_libraries(socks_client ${Boost_LIBRARIES} pthread)
else()
	target_link_libraries(socks_server ${Boost_LIBRARIES})
	target_link_libraries(socks_client ${Boost_LIBRARIES})
endif()

install(TARGETS socks_server RUNTIME DESTINATION bin)
install(TARGETS socks_client RUNTIME DESTINATION bin)

